#include<iostream>
#include<pthread.h>
#include<unistd.h>
using namespace std;

//临界区加锁互斥购票系统
int ticket=10;
pthread_mutex_t mutex;
void* Routine(void*s)
{
  char * st=(char*)s;
  //访问临界资源
  while(1)
  {
    //申请锁
    pthread_mutex_lock(&mutex);
    if(ticket>0)
    {
      //抢票
      ticket--;
      cout<<st<<" get a ticket, the ticket still have "<<ticket<<endl;
      //sleep(1);
    }
    else{
      pthread_mutex_unlock(&mutex);   //注意此处要加解锁
      break;
    }
    pthread_mutex_unlock(&mutex);
    sleep(1);
  }
  return nullptr;
}
int main()
{
  pthread_t t1,t2,t3,t4;
  //初始化锁
  pthread_mutex_init(&mutex,nullptr);

  pthread_create(&t1,nullptr,Routine,(void*)"thread1");
  pthread_create(&t2,nullptr,Routine,(void*)"thread2");
  pthread_create(&t3,nullptr,Routine,(void*)"thread3");
  pthread_create(&t4,nullptr,Routine,(void*)"thread4");

  //main pthread
  pthread_join(t1,nullptr);
  pthread_join(t2,nullptr);
  pthread_join(t3,nullptr);
  pthread_join(t4,nullptr);

  pthread_mutex_destroy(&mutex);
  return 0;
}



//int ticket=100;
//void * Routine2(void*s)
//{
//  while(1)
//  {
//    if(ticket>90)
//    {
//      sleep(15);
//      cout<<"thread1 over, the ticket still have "<<ticket<<endl;
//      ticket--;
//      cout<<"thread2 get ticket ,the ticket still have "<<ticket<<endl;
//    }
//    else{
//      break;
//    }
//  }
//    return nullptr;
//  }
//
//void * Routine1(void *s)
//{
//  while(1)
//  {
//    if(ticket>90)
//    {
//      ticket--;
//      cout<<"thread1 get ticket ,the ticket still have "<<ticket<<endl;
//      sleep(1);
//    }
//    else{
//      break;
//    }
//  }
//    return nullptr;
//  }
//
////验证临界区资源2
//int main()
//{
//  pthread_t t1,t2;
//  pthread_create(&t1,nullptr,Routine1,nullptr);
//  pthread_create(&t2,nullptr,Routine2,nullptr);
//
//  pthread_join(t1,nullptr);
//  pthread_join(t2,nullptr);
//  return 0;
//}         //验证结果表示，if()判断临界区资源后，不会保存符合条件的临界资源，而是满足条件后，再从内存中读取数据【因为无需所有的判断条件，都需要此资源】





////验证临界区资源问题1
//int ticket=10;
//void* Routine(void* s)
//{
//  while(1)
//  {
//    sleep(2);
//    if(ticket<=0)
//    {
//      return nullptr;
//    }
//    ticket--;
//   cout<<"pthread is"<<pthread_self()<<" get a ticket and the ticket still"<<ticket<<endl;
//  }
//  return nullptr;
//}
//int main()
//{
//  //创建五个线程
//  pthread_t pid[5];
//  int i=0;
//  for(;i<5;i++)
//  {
//    pthread_create(pid+i,nullptr,Routine,nullptr);
//  }
//  //主线程
//  for(i=0;i<5;i++)
//  {
//    pthread_join(pid[i],nullptr);
//  }
//
//  return 0;
//}
